package com.ygo.feihua.view;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;

public class TextLight
{

	private HashMap<String,LightKey> mkeys;
	private TextView mtextview;
    //双引号颜色 单引号颜色 默认绿色
	private int yincolor=0xff66ff66;
	//数字颜色 默认红色
    private int numbercolor=0xffee6666;
	public TextLight(TextView textview,HashMap<String,LightKey> keys){
		mkeys=keys;
		mtextview=textview;
	}
    //设置引号颜色
	public void setYinColor(int scolor){
		yincolor=scolor;
	}
    //设置单引号颜色
	//设置数字颜色
	public void setNumberColor(int ncolor){
		numbercolor=ncolor;
	}
	
    //设置关键词列表
	public void setKeys(HashMap<String,LightKey> keys){
		mkeys=keys;
	}
    
    //开始分析并高亮
    //mtext是代码字符
	public void open(String mtext){
	int len=mtext.length();
    if(mtext==null || len == 0)return;
    
    //创建引号表 存所有引号的位置
    //键 值代表一组引号  键是左引号 值是右引号  因为引号是一组 必须两个
	HashMap<Integer, Integer> yins=new HashMap<Integer,Integer>(256);
    
    makeKfu(yins,mtext,0,len);//遍历字符 把引号存进哈希表 用来识别关键词是否在引号内
	
    //创建用来实现高亮的类
    SpannableStringBuilder Textbuilder = new SpannableStringBuilder(mtext); 
      
    //遍历引号表  先把引号里面变成绿色
    for(Map.Entry<Integer, Integer> m:yins.entrySet()){
		//如果 键＜ 值 且 值>0  则
          if(m.getKey()<m.getValue() && m.getValue()>0){
			//添加高亮 
              Textbuilder.setSpan(new ForegroundColorSpan(yincolor),m.getKey(),m.getValue()+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
	        }
		}
		
        //开始扫描字符
		char tmec;
		String tems;
		boolean openflag=false;
		int flagppst=0;
		LightKey mk=null;
	    Integer k;
		for(int i=0;i<len;i++){//遍历每一个字符
			tmec=mtext.charAt(i);//获取当前字符
			k=yins.get(i);//取引号位置
			if(k!=null && k>0){
				i=k+1;
				continue;//如果存在引号 则 跳过 引号
			}
			
            //如果当前字符 (不是字母 不是数字 不是下划线 不是$)
		//数字是ascii码	
            if(!((tmec>='0' && tmec<='9') || (tmec>='a' && tmec<='z') || (tmec>='A' && tmec<='Z') || tmec=='$' || tmec=='_')){
           // if(tmec<36 || (tmec>36 && tmec<48) || (tmec>57 && tmec<65) || (tmec>90 && tmec<95) ||(tmec>95 ) || (tmec>122 && tmec<127)){
				
                mk=mkeys.get(String.valueOf(tmec));//取关键词
                
				if(mk!=null){
                    //存在则添加高亮
               	Textbuilder.setSpan(new ForegroundColorSpan(mk.foreg_color),i,i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
				}
				
                //openflag用来标识 
				if(openflag){
				    openflag=false;
					tems=mtext.substring(flagppst,i);
					
                    //(判断是否数字)如果第一位是数字 则为数字
                    if(tems.charAt(0)>47 && tems.charAt(0)<58){
					    //如果是数字 判断有木有负号
                        if(flagppst>0 && mtext.charAt(flagppst-1)=='-'){
							flagppst--;
						}
                        //添加高亮
						Textbuilder.setSpan(new ForegroundColorSpan(numbercolor),flagppst,i,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
					}else{
                        //如果不是数字
					mk=mkeys.get(tems);
					if(mk!=null){
                        //关键词存在  则添加高亮
						Textbuilder.setSpan(new ForegroundColorSpan(mk.foreg_color),flagppst,i,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
					}
					}
					
				}
			}else{
				if(!openflag){
					openflag=true;
					flagppst=i;
				}
				
			}
			
		}


	
	
	
	 mtextview.setText(Textbuilder);
	//把高亮设置进控件
	
	}
	private void makeKfu(HashMap<Integer,Integer> yins,String mtext,int start,int end){
		//扫描每一个字符 判断引号 判断引号前面有没有反斜杠
        int syin=-1,dyin=-1;
		for (int i=start;i<end;i++){
			switch (mtext.charAt(i)){
				case '"':
					if(i>0 && mtext.charAt(i-1)=='\\'){
						continue;
					} 
					if(syin<0){
						syin=i;
						yins.put(syin,-1);
					}else{
						yins.put(i,syin);
						yins.put(syin,i);
					    syin=-1;
					}
					break;
				case '\'':
					if(i>0 && mtext.charAt(i-1)=='\\'){
						continue;
					}
					if(dyin<0){
						dyin=i;
						yins.put(dyin,-1);
					}else{
						yins.put(i,dyin);
						yins.put(dyin,i);
					    dyin=-1;
					}
					break;
					
					
			}
		}
	}
	
}
